双11全链路压测中通过Perf发现的一个SpringMVC 的性能问题
在最近的全链路压测中TPS不够理想,然后通过perf 工具(perf record 采样, perf report 展示)看到(可以点击看大图):
再来看CPU消耗的火焰图:
图中CPU的消耗占21%,不太正常。
可以看到Spring框架消耗了比较多的CPU,具体原因就是在Spring MVC中会大量使用到
@RequestMapping
@PathVariable
带来使用上的便利
业务方修改代码去掉spring中的methodMapping解析后的结果(性能提升了40%):
图中核心业务逻辑能抢到的cpu是21%(之前是15%)。spring methodMapping相关的也在火焰图中找不到了
Spring收到请求URL后要取出请求变量和做业务运算,具体代码(对照第一个图的调用堆栈):
1 | 170 public RequestMappingInfo More ...getMatchingCondition(HttpServletRequest request) { |
doMatch 代码:
1 | 96 |
最后补一个找到瓶颈点后 Google到类似问题的文章,并给出了具体数据和解决方法:http://www.cnblogs.com/ucos/articles/5542012.html
以及这篇文章中给出的优化前后对比图: